import { useParams } from 'common' import { keyBy } from 'lodash' import { useCallback, useMemo } from 'react' import { toast } from 'sonner' import { ENV_VAR_RAW_KEYS } from '@/components/interfaces/Integrations/Vercel/Integrations-Vercel.constants' import { isVercelUrl } from '@/components/interfaces/Integrations/Vercel/VercelIntegration.utils' import ProjectLinker, { ForeignProject, } from '@/components/interfaces/Integrations/VercelGithub/ProjectLinker' import { Markdown } from '@/components/interfaces/Markdown' import VercelIntegrationWindowLayout from '@/components/layouts/IntegrationsLayout/VercelIntegrationWindowLayout' import { ScaffoldColumn, ScaffoldContainer } from '@/components/layouts/Scaffold' import { vercelIcon } from '@/components/to-be-cleaned/ListIcons' import { useOrgIntegrationsQuery } from '@/data/integrations/integrations-query-org-only' import { useIntegrationVercelConnectionsCreateMutation } from '@/data/integrations/integrations-vercel-connections-create-mutation' import { useVercelProjectsQuery } from '@/data/integrations/integrations-vercel-projects-query' import { useOrganizationsQuery } from '@/data/organizations/organizations-query' import { BASE_PATH } from '@/lib/constants' import { EMPTY_ARR } from '@/lib/void' import { useIntegrationInstallationSnapshot } from '@/state/integration-installation' import type { NextPageWithLayout, Organization } from '@/types' const VERCEL_ICON = ( Vercel Icon ) const VercelIntegration: NextPageWithLayout = () => { const { slug, configurationId, next } = useParams() /** * Fetch the list of organization based integration installations for Vercel. * * Array of integrations installed on all */ const { data: integrationData } = useOrgIntegrationsQuery({ orgSlug: slug }) const { data } = useOrganizationsQuery({ enabled: slug !== undefined }) const organization = data?.find((organization: Organization) => organization.slug === slug) const integration = integrationData?.find( (x) => x.metadata !== undefined && 'configuration_id' in x.metadata && x.metadata?.configuration_id === configurationId ) const { data: vercelProjectsData, isPending: isLoadingVercelProjectsData } = useVercelProjectsQuery( { organization_integration_id: integration?.id, }, { enabled: integration?.id !== undefined } ) const vercelProjects = useMemo(() => vercelProjectsData ?? EMPTY_ARR, [vercelProjectsData]) const vercelProjectsById = useMemo(() => keyBy(vercelProjects, 'id'), [vercelProjects]) const getForeignProjectIcon = useCallback( (_project: ForeignProject) => { const project = vercelProjectsById[_project.id] return !project?.framework ? ( vercelIcon ) : ( {`icon`} ) }, [vercelProjectsById] ) const snapshot = useIntegrationInstallationSnapshot() const { mutate: createConnections, isPending: isCreatingConnection } = useIntegrationVercelConnectionsCreateMutation({ onSuccess() { if (next && isVercelUrl(next)) { snapshot.setLoading(false) window.location.href = next } }, onMutate() { snapshot.setLoading(true) }, onError(error) { snapshot.setLoading(false) toast.error(`Creating connection failed: ${error.message}`) }, }) const onCreateConnections = useCallback( (vars: any) => { createConnections({ ...vars, connection: { ...vars.connection, metadata: { ...vars.connection.metadata, brivenConfig: { projectEnvVars: { write: true, }, }, }, }, }) }, [createConnections] ) return ( <>

Create your first Project Connection

{ if (next && isVercelUrl(next)) { window.location.href = next } }} loadingForeignProjects={isLoadingVercelProjectsData} mode="Vercel" /> { return `\n - \`${x}\`` })} `} />
) } VercelIntegration.getLayout = (page) => ( {page} ) export default VercelIntegration